package ensa.sid.rida.SID;
import java.awt.BorderLayout;
import java.awt.Desktop;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.nodes.Element;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class interfaceApplication extends JFrame implements Runnable {

	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private JTextField textField;
	JProgressBar progressBar;

	JLabel LabelChemin;
	JButton btnParcourir;
	JButton btnRecherche;
	JLabel LabelRemarque;
	ZModel model;
	JLabel etat;
	int value;
	int nombre_auteur = 0;
	int nombre_pays = 0;
	int nombre_organisme = 0;
	int nombre_motCle = 0;

	public interfaceApplication() {
		LabelChemin = new JLabel("Chemin du fichier :");
		btnParcourir = new JButton("Parcourir");
		btnRecherche = new JButton("Rechercher");
		LabelRemarque = new JLabel("(NB : fichier.txt)");
		contentPane = new JPanel();

		setTitle("Moteur de Recherche sur USPTO");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(250, 200, 677, 409);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		LabelChemin.setBounds(90, 44, 109, 14);
		contentPane.add(LabelChemin);

		textField = new JTextField();
		textField.setBounds(224, 41, 206, 20);
		contentPane.add(textField);
		textField.setColumns(10);

		btnParcourir.setBounds(440, 40, 89, 23);
		contentPane.add(btnParcourir);

		btnRecherche.setBounds(440, 90, 127, 23);
		contentPane.add(btnRecherche);

		LabelRemarque.setBounds(224, 72, 121, 14);
		contentPane.add(LabelRemarque);

		progressBar = new JProgressBar(0, 100);
		progressBar.setBounds(179, 144, 313, 20);
		progressBar.setValue(0);
		progressBar.setStringPainted(true);
		contentPane.add(progressBar);

		Object[][] donnees = { { 0, 0, 0, 0 } };
		String[] entetes = { "Auteurs", "Pays", "Organisme", "Mot Cl�" };

		model = new ZModel(donnees, entetes);

		JTable tableau = new JTable(model);
		tableau.setFont(new Font("Tahoma", Font.BOLD, 11));
		tableau.setEnabled(false);
		tableau.setShowHorizontalLines(false);
		tableau.setRowSelectionAllowed(false);
		tableau.setShowGrid(false);
		tableau.setShowVerticalLines(false);

		JPanel panel = new JPanel();
		panel.setBounds(110, 258, 456, 66);

		tableau.getTableHeader().setResizingAllowed(false);
		tableau.getTableHeader().setReorderingAllowed(false);
		tableau.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		contentPane.add(panel);
		panel.add(tableau.getTableHeader());
		panel.add(tableau, BorderLayout.CENTER);

		etat = new JLabel("www.uspto.gov");
		etat.setBounds(189, 175, 241, 14);
		contentPane.add(etat);

		JMenuBar menuBar = new JMenuBar();
		JMenu test1 = new JMenu("Fichier");
		JMenu test2 = new JMenu("Help");
		JMenu test3 = new JMenu("A propos");

		menuBar.add(test1);
		menuBar.add(test2);
		menuBar.add(test3);

		JMenuItem item1 = new JMenuItem("Fermer");
		JMenuItem item2 = new JMenuItem("?");
		JMenuItem item3 = new JMenuItem("Exemple fichier txt");
		JMenuItem item4 = new JMenuItem("Guide d'utilisation");

		item2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				JOptionPane.showMessageDialog(null,
						"R�alis�e par : Rida Rechrache 2013/2014", "A propos",
						JOptionPane.INFORMATION_MESSAGE);
			}
		});

		test1.add(item1);
		test3.add(item2);
		test2.add(item3);
		test2.add(item4);

		item1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);

			}
		});
		item3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Desktop desktop = Desktop.getDesktop();
				if (desktop.isSupported(Desktop.Action.BROWSE)) {
					try {
						desktop.open(new File("Fichier-Liens.txt"));
					} catch (Exception e) {
						e.printStackTrace();
					}
				}

			}
		});
		menuBar.setBounds(0, 0, 661, 21);
		contentPane.add(menuBar);

		btnParcourir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				JFileChooser ChoixFichierVel = new JFileChooser();
				ChoixFichierVel.setDialogTitle("Entrer un Fichier");
				ChoixFichierVel.setFileSelectionMode(JFileChooser.FILES_ONLY);// fichiers
																				// seulement
				ChoixFichierVel.setAcceptAllFileFilterUsed(false);// ne pas
																	// mettre de
																	// filtre de
																	// fichier
				ChoixFichierVel.setApproveButtonText("Ouvrir fichier"); // intitule
																		// du
																		// bouton

				if (ChoixFichierVel.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
					textField.setText("");
					int index = -1;
					String MonFichierVel = (ChoixFichierVel.getSelectedFile()
							.getName() != null) ? ((index = ChoixFichierVel
							.getSelectedFile().getName().lastIndexOf(".")) == -1) ? ChoixFichierVel
							.getSelectedFile().getName() : ChoixFichierVel
							.getSelectedFile().getAbsolutePath()
							: "";

					textField.setText(MonFichierVel);
				}
			}
		});

		btnRecherche.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				if (textField.getText().equals(""))

					JOptionPane.showMessageDialog(null,
							"S�l�ctionner un fichier.txt SVP..!!!");

				else {

					// ///////////////////////////////////////////////////////////////////////////////////////////////////
					try {

						InetAddress address = InetAddress
								.getByName("www.uspto.gov");

						if (address != null) {

							btnRecherche.setEnabled(false);

							btnParcourir.setEnabled(false);

							value = 0;
							String str = "<html>" + "<font color=\"#008000\">"
									+ "<b>" + "searching is in process......."
									+ "</b>" + "</font>" + "</html>";
							etat.setText(str);
							lanceLongTraitement();
						}
					} catch (IOException erreurConnexion) {
						// TODO Auto-generated catch block
						JOptionPane.showMessageDialog(null,
								"Pas de connexion internet...!!!");

					}

					// ///////////////////////////////////////////////////////////////////////////////////////////////////

				}
			}
		});

	}

	public void lanceLongTraitement() {
		Thread t = new Thread(this);
		t.start();
		// maintenant nous rendons la main au processus d'evenement
	}

	// methode de l'interface Runnable
	// lance un nouveau thread qui va executer le code de la methode
	// longTraitement
	public void run() {
		this.longTraitement();
	}

	public void longTraitement() { // execute la succession d'operation ...
									// on est plus dans le processus d'evenement
									// mais dans le nouveau Thread

		Thread th = new Thread() {
			public void run() {
				String fichier = textField.getText();
				lectureFichier(fichier);

			}
		};
		th.start();

		for (int i = 0; i < 100; i++) {

			this.uneOperation();
			// maintenant on appelle la methode pour mettre a jour la barre
			// de progression
			this.majProgress();

		}
	}

	// methode qui effectue une pause pour simuler une operation
	synchronized void uneOperation() {
		try {
			this.wait(100);

		} catch (InterruptedException e) {
		}
	}

	void majProgress() {
		if (SwingUtilities.isEventDispatchThread()) {
			progressBar.setValue(++value);

			if (value == 100) {
				btnRecherche.setEnabled(true);
				btnParcourir.setEnabled(true);
				textField.setText("");
				// pb.setValue(0);
				int c1 = nombre_auteur;
				int c2 = nombre_pays;
				int c3 = nombre_organisme;
				int c4 = nombre_motCle;

				final Object[][] dataBis = { { c1, c2, c3, c4 } };
				model.setData(dataBis);

				nombre_auteur = 0;
				nombre_pays = 0;
				nombre_organisme = 0;
				nombre_motCle = 0;

				String str = "<html>" + "<font color=\"#FF0000\">" + "<b>"
						+ "searching completed." + "</b>" + "</font>"
						+ "</html>";
				etat.setText(str);
			}

		} else {
			Runnable callMAJ = new Runnable() {
				public void run() {
					majProgress();

				}
			};

			SwingUtilities.invokeLater(callMAJ);
		}
	}

	void lectureFichier(String fichier) {

		Document doc, doc1;
		try {
			InputStream ips = new FileInputStream(fichier);
			InputStreamReader ipsr = new InputStreamReader(ips);
			BufferedReader br = new BufferedReader(ipsr);
			String ligne;

			List<String> lisConjonction = new ArrayList<String>();
			lisConjonction.add("and");
			lisConjonction.add("if");
			lisConjonction.add("as");
			lisConjonction.add("that");
			lisConjonction.add("else");
			lisConjonction.add("of");
			lisConjonction.add("the");
			lisConjonction.add("in");
			lisConjonction.add("for");
			int sizeOfTheShortestList = lisConjonction.size();
			int nombre_brevet = 0;
			List<String> listPays = new ArrayList<String>();
			ConnexionBD c = new ConnexionBD();

			// LineNumberReader l = new LineNumberReader(
			// new BufferedReader(new InputStreamReader(ips)));
			// while ((ligne=l.readLine())!=null)
			// {
			// nombre_lien = l.getLineNumber();
			// }
			// // System.out.println(nombre_lien);

			while ((ligne = br.readLine()) != null) {

				doc = Jsoup.connect(ligne).get();
				nombre_brevet++;

				System.out
						.println("----------------------------------------------brevet N�"
								+ nombre_brevet
								+ "------------------------------------------------");

				
				
				
//les auteurs et les pays 				
				Element Inventors = doc.select("td:contains(Inventors:) + td")
						.first();

				

				System.out.println("->Auteurs :" + Inventors.text());

				for (Element link : Inventors.children()) {
					Elements auteur = link.select("b");
					Elements pays = link.select("i");

					if (!pays.text().equals("")) {

						String extrairePays = pays.text().substring(
								pays.text().indexOf(",") + 1,
								pays.text().length() - 1);
						String enleverEspace = extrairePays.trim();

						if (!listPays.contains(enleverEspace)) {

							listPays.add(enleverEspace);

						}

					}

					if (!auteur.text().equals("")) {

						String enleverPointVirgule = auteur.text().replaceAll(
								";", "");
						String structure = enleverPointVirgule.trim();
						String prenom = structure.substring(0,
								structure.indexOf(" "));
						String nom = structure.substring(
								structure.indexOf(" ") + 1, structure.length());

						// System.out.println("                  prenom :"+prenom+"  nom:"+nom);
						String req = "";
						// c.ajouter(req);

						nombre_auteur++;

					}

				}

				Iterator<String> i = listPays.iterator();
				nombre_pays = listPays.size();
				while (i.hasNext()) {
					String x = i.next();

					System.out.println(" Pays :" + x);

				}

				
//l'organisme de brevet 
				/**********************************************/
				Element Assignee = doc.select("td:contains(Assignee:) + td")
						.first();

				Elements organismeLien = Assignee.select("b");

				nombre_organisme++;

				System.out.println("->organisme :" + organismeLien.text());
				String org = organismeLien.text().substring(0,
						organismeLien.text().indexOf(","));

				System.out.println("            organisme :" + org);
				String reqAssignee = "INSERT INTO organisme(DesignationOrganisme) SELECT '"
						+ org
						+ "' "
						+ " FROM organisme WHERE NOT EXISTS(SELECT DesignationOrganisme FROM "
						+ "organisme WHERE DesignationOrganisme='"
						+ org
						+ "' ) limit 1";
				// c.ajouter(reqAssignee);

				
				
//Titre de brevet
				// /////////////////////////////////////////
				Elements motCle = doc.select("body>font");
				StringBuffer strMotCle = new StringBuffer(motCle.text());

				String sMotCle = (strMotCle + " ").toLowerCase();
				System.out.println("->Titre :" + sMotCle);

				Pattern patternMotCle = Pattern.compile("(.*?) ");
				Matcher mMotCle = patternMotCle.matcher(sMotCle);
				while (mMotCle.find()) {

					if (!lisConjonction.contains(mMotCle.group(1))) {
						System.out.println("             mot cle :"
								+ mMotCle.group(1));
						String reqMotCle = "INSERT INTO motcle(motcle) VALUES  ('"
								+ mMotCle.group(1) + "');";
						// c.ajouter(reqMotCle);
						nombre_motCle++;
					}
				}

				// ////////////////////////////////////

			}

			br.close();
			c.fermer();
			System.out
					.println("-------------------------------------------------------------------------------------------------------------");

			System.out.println("Nombre d'auteur dans ce fichier :"
					+ nombre_auteur);
			System.out
					.println("Nombre de pays dans ce fichier :" + nombre_pays);
			System.out.println("Nombre d'organisme dans ce fichier :"
					+ nombre_organisme);
			System.out.println("Nombre de mot cl� dans ce fichier :"
					+ nombre_motCle);
		} catch (Exception e) {
			System.out.println(e.toString());
		}

	}

	public static void main(String[] args) {

		EventQueue.invokeLater(new Runnable() {
			public void run() {

				try {

					interfaceApplication frame = new interfaceApplication();
					frame.setVisible(true);

				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		});
	}
}
